package br.com.sgi.model;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import br.com.sgi.util.DateUtil;

import com.sun.istack.NotNull;

@Entity
@Table(name="AGENDA")
@NamedQueries({
@NamedQuery(
	    name="busca_agenda_mes_ano",
	    query="SELECT a FROM Agenda a" +	    		    	
	    	  " WHERE to_char(a.data,'DD/MM/YYYY') = :data" +
	    	  "\n AND (a.igreja.coSeqIgreja = :coIgreja OR a.igreja.coSeqIgreja in(SELECT ui.igreja.coSeqIgreja from UsersIgreja ui WHERE ui.users.username= :username)) " +
	    	  " and a.sistema.coSeqSistema = :coSistema"
	    	  
	),
	  @NamedQuery(
			    name="buscarCompromissoDia",
			    query="\n SELECT a FROM Agenda a " +
		    	  "\n WHERE a.igreja.sistema.coSeqSistema =:coSistema" +
		    	  "\n AND (a.igreja.coSeqIgreja = :coIgreja OR a.igreja.coSeqIgreja in(SELECT ui.igreja.coSeqIgreja from UsersIgreja ui WHERE ui.users.username= :username)) " +
		    	  "\n AND  Extract(Day From data) = Extract(Day From Now()) " +
		    	  "\n AND  Extract(Month From data) = Extract(Month From Now()) "
		    	  ),
	  @NamedQuery(
			    name="buscarCompromissoMes",
			    query="\n SELECT a FROM Agenda a " +
		    	  "\n WHERE a.igreja.sistema.coSeqSistema =:coSistema" +
		    	  "\n AND (a.igreja.coSeqIgreja = :coIgreja OR a.igreja.coSeqIgreja in(SELECT ui.igreja.coSeqIgreja from UsersIgreja ui WHERE ui.users.username= :username)) " +
		    	  "\n AND  Extract(Month From data) = Extract(Month From Now()) "
		    	  )
})
public class Agenda {

	@Id
	@Column(name="CO_SEQ_AGENDA")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seq_agenda_seqagenda")  
	@SequenceGenerator(name = "seq_agenda_seqagenda", sequenceName = "SGI.seq_agenda") 
	private Long coSeqAgenda;
	
	@Column(name="DATA")
	private Date data;
	
	@Column(name="DESCRICAO", length=500)
	private String descricao;
	
	
	@Column(name="HORA_INICIO", length=5)
	private String horaInicio;
	
	@Column(name="HORA_INICIO_TURNO", length=2)
	private String horaInicioTurno;
	
	@Column(name="HORA_FIM_TURNO", length=2)
	private String horaFimTurno;
	 
	@Column(name="HORA_FIM", length=5)
	private String horaFim;

	@Column(name="TIPO", length=30)	
	private String tipo;
	
	
	@Column(name="TITULO", length=100)
	private String titulo;
	
	//@Column(name="CO_IGREJA")
	@ManyToOne	
	private Igreja igreja;
	
	
	@ManyToMany(cascade={CascadeType.MERGE}, fetch = FetchType.EAGER)
	@JoinTable(name = "RL_AGENDA_IGREJA", joinColumns = { @JoinColumn(name = "CO_AGENDA", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "CO_IGREJA", nullable = false) })
	private List<Igreja> igrejas;
	
	@NotNull
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="CO_SEQ_SISTEMA")
	private Sistema sistema;
	
	@Transient
	private String dataFormatada;
	
	@Transient
	private String nomeIgrejas;
	
	
	public Long getCoSeqAgenda() {
		return coSeqAgenda;
	}

	public void setCoSeqAgenda(Long coSeqAgenda) {
		this.coSeqAgenda = coSeqAgenda;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getHoraInicio() {
		return horaInicio;
	}

	public void setHoraInicio(String horaInicio) {
		this.horaInicio = horaInicio;
	}

	public String getHoraFim() {
		return horaFim;
	}

	public void setHoraFim(String horaFim) {
		this.horaFim = horaFim;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getHoraInicioTurno() {
		return horaInicioTurno;
	}

	public void setHoraInicioTurno(String horaInicioTurno) {
		this.horaInicioTurno = horaInicioTurno;
	}

	public String getHoraFimTurno() {
		return horaFimTurno;
	}

	public void setHoraFimTurno(String horaFimTurno) {
		this.horaFimTurno = horaFimTurno;
	}

	public Igreja getIgreja() {
		return igreja;
	}

	public void setIgreja(Igreja igreja) {
		this.igreja = igreja;
	}

	public Sistema getSistema() {
		return sistema;
	}

	public void setSistema(Sistema sistema) {
		this.sistema = sistema;
	}

	public String getDataFormatada() {
		if(data != null){			
			dataFormatada = DateUtil.getDateStr(data);
			dataFormatada +=  " " + horaInicio + " - "+ horaFim;
		}
		return dataFormatada;
	}

	public void setDataFormatada(String dataFormatada) {
		this.dataFormatada = dataFormatada;
	}

	public List<Igreja> getIgrejas() {
		if(igrejas == null)
			igrejas = new ArrayList<Igreja>();
		return igrejas;
	}

	public void setIgrejas(List<Igreja> igrejas) {
		this.igrejas = igrejas;
	}

	public String getNomeIgrejas() {
		StringBuilder nomes =  new StringBuilder();
		for(Igreja ig: getIgrejas()){
			nomes.append(ig.getNome());
			nomes.append(", ");
		}
		
		nomes.append(getIgreja().getNome());
		
		return nomes.toString();
	}

	
	
	public void setNomeIgrejas(String nomeIgrejas) {
		this.nomeIgrejas = nomeIgrejas;
	}

	
	
	
}